package br.org.acessobrasil.portal.persistencia;

import java.util.List;

import org.apache.log4j.Logger;

import br.org.acessobrasil.portal.modelo.Perfil;
import br.org.acessobrasil.portal.modelo.Privilegio;
import br.org.acessobrasil.portal.modelo.Sitio;
/**
 * Trata os acessos ao perfil
 * 
 * Implementado totalmente
 * @author Fabio Issamu Oshiro
 *
 */
public class PerfilDaoSpring extends SuperDao<Perfil>{
	private static Logger logger = Logger.getLogger(PerfilDaoSpring.class);
	public PerfilDaoSpring() {
		logger.info("PerfilDaoSpring instanciado.");
	}
	
	@SuppressWarnings("unchecked")
	public List<Perfil> list(Sitio sitio){
		return getEntityManager().createQuery("Select p from Perfil p where p.sitio = ?").setParameter(1, sitio).getResultList();
	}
	
	public Perfil select(Long nu_perfil) throws Exception {
		return getEntityManager().find(Perfil.class, nu_perfil);
	}
	
	@SuppressWarnings("unchecked")
	private void apagarPrivilegio(Long idPerfil) throws Exception{
		PrivilegioDaoSpring privilegioDaoSpring = new PrivilegioDaoSpring();
		privilegioDaoSpring.setEntityManager(getEntityManager());
		List<Privilegio> listPrivilegio = getEntityManager().createQuery(
				"Select p from " + Privilegio.class.getSimpleName() + " p where p.perfil.nu_perfil=:idPerfil")
			.setParameter("idPerfil",idPerfil)
			.getResultList();
		for(Privilegio privilegio:listPrivilegio){
			privilegioDaoSpring.apagar(privilegio);
		}
	}
	@Override
	public void delete(Perfil obj) throws Exception {
		apagarPrivilegio(obj.getNuPerfil());
		super.delete(obj);
	}

	/**
	 * Retorna lista de Perfil com o numero maior que nuHierarquia
	 * @param nuHierarquia -1 para todos ou outro numero 
	 * @param sitioAtual sitio
	 * @return lista de perfis
	 */
	@SuppressWarnings("unchecked")
	public List<Perfil> getList(int nuHierarquia, Sitio sitioAtual) {
		logger.debug("listando nuHierarquia = " + nuHierarquia + " sitioAtual=" + sitioAtual.getNuSitio());
		return getEntityManager().createQuery("Select p from Perfil p where p.sitio = ? and p.nuHierarquia > ?").setParameter(1, sitioAtual).setParameter(2, nuHierarquia).getResultList();
	}
}
